Zapis tisicu polozek do DB

Otázka od: David Klodner

4. 4. 2004 13:54

Zdravim,

chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
tisice radku.
Ja napr. importuju do sveho programu cenik zbozi o 13 000 polozkach.
Kazda polozka ma 25 atributu (ean, nazev, cena1, cena2 ...)
Cenik mam budto v textove podobe nebo jako DBF a potrebuju ho dostat do
IB6 tabulky.

Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v prubehu
hrozne zpomaluje. Prvnich 1000 polozek se ulozi
behem par vterin, ale posledni tisicovka zabere uz nekolik minut.

David Klodner
D5 Prof, IB6, WinXP


Odpovedá: Martin Schayna

4. 4. 2004 14:14

David Klodner <d.klodner@ordis.cz> wrote:
> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
> tisice radku.
>
> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v
> prubehu hrozne zpomaluje. Prvnich 1000 polozek se ulozi
> behem par vterin, ale posledni tisicovka zabere uz nekolik minut.

Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
a pokazde tento blok commitovat.

Martin Schayna


Odpovedá: David Klodner

4. 4. 2004 14:58

>> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB
zapsat
>> tisice radku.
>>
>> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v
>> prubehu hrozne zpomaluje. Prvnich 1000 polozek se ulozi behem par
>> vterin, ale posledni tisicovka zabere uz nekolik minut.

>Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
>a pokazde tento blok commitovat.

>Martin Schayna

Jak se to v TIBTransaction nastavi?
Params mam:
read_committed
rec_version
nowait

A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
stane? Neulozi se ani jedna?
Nebo vsechny krome te chybne?

David Klodner
D5 Prof, IB6, WinXP



Odpovedá: Martin Schayna

4. 4. 2004 15:20

David Klodner <d.klodner@ordis.cz> wrote:
>> Nepises jak resis transakce, ale nejrychlejsi metoda pro takoveto
>> vkladani dat je zapisovat v ramci jedne transakce 500-1000 vet
>> a pokazde tento blok commitovat.
>
> Jak se to v TIBTransaction nastavi?
> Params mam:
> read_committed
> rec_version
> nowait

Params jsou spravne, ale musis explicitne volat StartTransaction/Commit

  IBTransaction.StartTransaction;
  try
    // zapis vet
    IBTransaction.Commit;
  except
    IBTransaction.Rollback; // to kdyby doslo k jine chybe
  end;

> A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
> stane? Neulozi se ani jedna?

Ano, pokud selze Commit, neulozi se nic od StartTransaction.
Pokud v prubehu zapisu chces odvolat vsechny zmeny sam,
musis zavolat Rollback.

Martin Schayna


Odpovedá: Fedor fi0dor Tirsel

4. 4. 2004 15:37

David Klodner wrote:

> Jak se to v TIBTransaction nastavi?
> Params mam:
> read_committed
> rec_version
> nowait

Nenastavi sa to nijak... proste pri vkladani urcite iterujete (for, while,
repeat), tak si tam treba osetrit nieco na sposob:

if (i=1000) then
 begin
   transaction.commit;
   i := 0;
 end;

kde "i" je lokalna premenna oznacujuca pocet uz vlozenych riadkov do DB.

> A kdyz budu commitovat naraz 1000 vet a v jedne bude chyba, tak co se
> stane? Neulozi se ani jedna?
> Nebo vsechny krome te chybne?

Neulozi sa ani jedna -- princip transakcii: "bud vsetko, alebo nic".

> David Klodner
> D5 Prof, IB6, WinXP

Este snad jeden tip: skuste pouzivat IBScript resp. pripravit si
"insert
query" s parametrami (query.pramByName()), dat query.Prepare a potom
si uz iba
pri iteracii menit parametre dotazu. Taktiez by sa mohlo hodit "vypnut" indexy
tabulky, kam vkladate udaje, a po vlozeni ich opat zaktivovat (pozrite sa na
syntax ALTER INDEX).

S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info

Odpovedá: Karel Kral

5. 4. 2004 14:37

My to resime pres stored proceduru, kterou volame pro pridani kazdeho
radku. Jako pamametry predavame hodnoty jednotlivych poli. U MS SQL je
to nejrychlejsi.

Cely postup je tento:
pridat vsechny zaznamy do pracovni tabulky - bez indexu
pracovni tabulku prejmenovat na ostrou a preindexovat

David Klodner wrote:
>
> Zdravim,
>
> chtel bych se zeptat, jak resite pripady, kdy potrebujete do DB zapsat
> tisice radku.
> Ja napr. importuju do sveho programu cenik zbozi o 13 000 polozkach.
> Kazda polozka ma 25 atributu (ean, nazev, cena1, cena2 ...)
> Cenik mam budto v textove podobe nebo jako DBF a potrebuju ho dostat do
> IB6 tabulky.
>
> Zapisuju to pres IBTable, ale je to dost pomale a hlavne se to v prubehu
> hrozne zpomaluje. Prvnich 1000 polozek se ulozi
> behem par vterin, ale posledni tisicovka zabere uz nekolik minut.
>
> David Klodner
> D5 Prof, IB6, WinXP

--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________